﻿#pragma once
#include <string>
#include <list>
#include <map>
#include <set>
#include "baseoption_global.h"

namespace SymbolPackage
{
	// 合约的完备内容
#pragma pack(8)
	struct SymbolInfo
	{
		char ExchangeID[16];  // 交易所代码
		char InstrumentID[64]; // 合约代码
							   ///合约数量乘数
		int VolumeMultiple;
		///最小变动价位
		float PriceTick;
		///产品类型
		char ProductClass;
		///合约名称
		char	InstrumentName[24];
		///多头保证金率
		float	LongMarginRatio;
		///空头保证金率
		float	ShortMarginRatio;
		///市价单最大下单量
		int	MaxMarketOrderVolume;
		///市价单最小下单量
		int	MinMarketOrderVolume;
		///限价单最大下单量
		int	MaxLimitOrderVolume;
		///限价单最小下单量
		int	MinLimitOrderVolume;
		///交割年份
		int	DeliveryYear;
		///交割月
		int	DeliveryMonth;

		//uint32_t ticker_id;  // local index
	};
#pragma pack()

	//typedef std::list<SymbolInfo> SymbolsGroup;
	// 读取今日的合约
	class BASEOPTION_EXPORT SymbolsReader
	{
	public:
		// 传入工作目录和时间
		SymbolsReader(time_t cuTime);
		SymbolsReader(tm cuTime);
		// 直接传入路径
		SymbolsReader(const std::string &psymbolFileBin, bool beAbsPath);
		// 返回某个合约信息
		SymbolInfo GetSymbolInfo(const std::string &pSymbol);
		// 返回所有的合约
		void GetAllSymbolInfoList(std::list<SymbolInfo> &outSymbolList);
		// 只返回期货列表
		void GetAllFutureList(std::list<SymbolInfo> &outSymbolList);
	private:
		std::string m_symbolFileBin; // 合约列表的二进制文件

	};

	//// 记录今日的合约
	//class SymbolsGroupRecorder
	//{
	//public:
	//	SymbolsGroupRecorder(const std::string &pWorkspace);
	//	// 添加1个合约
	//	void AppendSymbol(CThostFtdcInstrumentField *pInstrument);
	//	// 保存所有的合约
	//	void SaveSymbols();
	//private:
	//	// 
	//	std::string m_symbolFileBin; // 合约列表的二进制文件
	//	std::list<SymbolInfo> m_sybolList;
	//};

	// 文本合约的读写
	class BASEOPTION_EXPORT SymbolReaderWriterText
	{
	public:
		// 新加一个合约
		void AppendSymbol(const std::string &pSymbol);
		// 保存
		void Save();
		// 读取
		void GetSymbolList(std::list<std::string> &oSymbolList);
	protected:
	
		std::string m_symbolFile;
		std::set<std::string> m_symbolList;
	};

	// 主力合约的读写（文本类型）
	class BASEOPTION_EXPORT MainSymbolReaderWriter : public SymbolReaderWriterText
	{
	public:
		MainSymbolReaderWriter(tm cuTime);
	};

	// 订单合约的读写（文本类型）
	class BASEOPTION_EXPORT OrderSymbolReaderWriter : public SymbolReaderWriterText
	{
	public:
		OrderSymbolReaderWriter();
	};

	// 获取最近的1天（包括今天）所有的期货合约列表
	void BASEOPTION_EXPORT GetTheLastFutureSymbolInfoList(std::list<SymbolInfo> &outList);

	// 获取最近的1天（包括今天）主力合约列表
	void BASEOPTION_EXPORT GetTheLastMainSymbolList(std::list<std::string> &outList, time_t theLastTime);

	class BASEOPTION_EXPORT SymbolListToChar
	{
	public:
		SymbolListToChar(const std::list<std::string> &pSymbolList);
		~SymbolListToChar();

		char **GetSymbolArray();
		int GetSymbolsSize();
	private:
		char **m_symbolArray;
		int m_symbolSize;
	};
}